package com.smart.community.commons.utils;

import lombok.extern.slf4j.Slf4j;

import java.util.List;
import java.util.Set;
import java.util.ArrayList;
import java.util.stream.Collectors;

/**
 * 菜单权限工具类
 * 用于处理菜单权限相关的逻辑
 * @author Wu.Liang
 * @since 2024-12-19
 * @version 1.0.0
 */
@Slf4j
public class MenuPermissionUtil {
    
    /**
     * 检查用户是否有菜单权限
     * 
     * @param menuCode 菜单代码
     * @param userPermissions 用户权限集合
     * @return 是否有权限
     */
    public static boolean hasMenuPermission(String menuCode, Set<String> userPermissions) {
        if (menuCode == null || userPermissions == null) {
            return false;
        }
        
        // 检查是否有超级管理员权限
        if (userPermissions.contains("*:*:*")) {
            return true;
        }
        
        // 检查是否有具体的菜单权限
        return userPermissions.contains(menuCode) || 
               userPermissions.contains("menu:" + menuCode) ||
               userPermissions.contains("*:menu:*");
    }
    
    /**
     * 过滤有权限的菜单列表
     * 
     * @param allMenus 所有菜单列表
     * @param userPermissions 用户权限集合
     * @return 有权限的菜单列表
     */
    public static List<String> filterAuthorizedMenus(List<String> allMenus, Set<String> userPermissions) {
        if (allMenus == null || userPermissions == null) {
            return new ArrayList<>();
        }
        
        return allMenus.stream()
                .filter(menu -> hasMenuPermission(menu, userPermissions))
                .collect(Collectors.toList());
    }
    
    /**
     * 获取菜单权限代码
     * 
     * @param menuCode 菜单代码
     * @return 权限代码
     */
    public static String getMenuPermissionCode(String menuCode) {
        if (menuCode == null) {
            return null;
        }
        return "menu:" + menuCode;
    }
    
    /**
     * 检查是否为菜单权限
     * 
     * @param permission 权限代码
     * @return 是否为菜单权限
     */
    public static boolean isMenuPermission(String permission) {
        return permission != null && permission.startsWith("menu:");
    }
    
    /**
     * 从权限代码中提取菜单代码
     * 
     * @param permission 权限代码
     * @return 菜单代码
     */
    public static String extractMenuCode(String permission) {
        if (!isMenuPermission(permission)) {
            return null;
        }
        return permission.substring(5); // 去掉"menu:"前缀
    }
}
